#pragma once

#include "Event.h"
#include "Hazel/Core/MouseCodes.h"

namespace Hazel
{
	class MouseEvent : public Event
	{
		public:
			MouseEvent(const float x, const float y) : m_MouseX(x), m_MouseY(y) {}
			inline float GetX() const { return m_MouseX; }
			inline float GetY() const { return m_MouseY; }

			std::string ToString() const override
			{
				std::stringstream ss;
				ss << "MouseMovedEvent" << m_MouseX << m_MouseY;
				return ss.str();
			}

			EVENT_CLASS_TYPE(MouseMoved)
			EVENT_CLASS_CATEGORY(EventCategoryMouse | EventCategoryInput)

		private:
			float m_MouseX, m_MouseY;
	};

	class MouseScrolledEvent : public Event
	{
		public:
			MouseScrolledEvent(const float x, const float y) : m_XOffset(x), m_YOffset(y) {}
			inline float GetXOffset() const { return m_XOffset; }
			inline float GetYOffset() const { return  m_YOffset; }

			std::string ToString() const override
			{
				std::stringstream ss;
				ss << "MouseScrolledEven" << m_XOffset << m_YOffset;
				return ss.str();
			}

			EVENT_CLASS_TYPE(MouseScrolled)
			EVENT_CLASS_CATEGORY(EventCategoryMouse | EventCategoryInput)
		private:
			float m_XOffset, m_YOffset;
	};

	class MouseButtonEvent : public Event
	{
		public:
			MouseCode GetMouseCode() const { return m_Button; }
			EVENT_CLASS_CATEGORY(EventCategoryMouse | EventCategoryInput | EventCategoryMouseButton)
		protected:
			MouseButtonEvent(const MouseCode button) : m_Button(button){}

			MouseCode m_Button;
	};

	class MouseButtonPressedEvent : public MouseButtonEvent
	{
		public:
			MouseButtonPressedEvent(const MouseCode button) : MouseButtonEvent(button) {}
			std::string ToString() const override
			{
				std::stringstream ss;
				ss << "MouseButtonPressedEvent" << m_Button;
				return ss.str();
			}
			EVENT_CLASS_TYPE(MouseButtonPressed)
	};

	class MouseButtonReleasedEvent : public MouseButtonEvent
	{
	public:
		MouseButtonReleasedEvent(const MouseCode button)
			: MouseButtonEvent(button) {
		}

		std::string ToString() const override
		{
			std::stringstream ss;
			ss << "MouseButtonReleasedEvent: " << m_Button;
			return ss.str();
		}

		EVENT_CLASS_TYPE(MouseButtonReleased)
	};
}